/*
 * 
 * Copyright (C) 2010-2012 Wilfried Elmenreich, Anita Sobe 
 * This file is part of VideoNetwork.
 * 
 * VideoNetwork is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 
 * You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>. 
 */
package proxy.repl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.TreeMap;

import proxy.Configuration;
import proxy.Content;
import proxy.HormoneControls;
import proxy.Link;
import proxy.Migration;
import proxy.SearchServerNode;
import proxy.UnitContainer;
import simulation.Simulator;

public class SearchServerPopRanking extends SearchServerNode {

	private double thresh;

	private double maxRank = 0;
	private double percOfTags = 0.5;

	public SearchServerPopRanking(int id, Simulator simulator,
			Configuration config, HormoneControls hCtrl) {
		super(id, simulator, config, hCtrl);

	}

	@Override
	protected Migration createMigration(UnitContainer uc, double highestPhero,
			Link bestlink) {
		if (maxRank == 0) {
			maxRank = simulator.getTagDirectory().size() * percOfTags;
			thresh = Math.log(maxRank);
		}
		Migration m = super.createMigration(uc, highestPhero, bestlink);
		ArrayList<Integer> rankedPop = new ArrayList<Integer>();
		if (!m.isCopy()) {
			Content current = uc.getVideoUnit().getContent();
			for (Link li : links) {
				SearchServerNode neighbor = (SearchServerNode) li
						.getTargetNode();
				TreeMap<Content, Integer> neighborReq = neighbor
						.getRequestCount();
				RequestCountComparator comp = new RequestCountComparator(
						neighborReq);
				ArrayList<Content> mostPopular = new ArrayList<Content>();
				mostPopular.addAll(neighborReq.keySet());
				Collections.sort(mostPopular, comp);
				rankedPop.add(mostPopular.indexOf(current));
			}
			Collections.sort(rankedPop);
			double n = 1 / (double) rankedPop.size();
			double sum = 0;
			for (int i = 0; i < rankedPop.size(); i++) {
				sum += Math.log(rankedPop.get(i) + 1);
			}
			if (n * sum <= thresh) {
				m.setCopy(true);
			}
			// System.out.println(n + " " + sum + " " + rankedPop.size() + " "
			// + " prating " + n * sum + " thresh " + thresh +
			// " maxRank "+maxRank);
		}
		return m;
	}
}
